#include "crc.h"

uint16_t CRC16_Modbus(uint8_t *data, uint16_t length)
{
  uint16_t crc = 0xFFFF; // 初始值

  for (uint16_t i = 0; i < length; i++)
  {
    crc ^= data[i]; // 将当前字节与 CRC 寄存器的低 8 位进行异或操作
    for (uint8_t j = 0; j < 8; j++)
    {
      if (crc & 0x0001)
      {                // 如果最低位为 1
        crc >>= 1;     // 右移一位
        crc ^= 0xA001; // 异或多项式
      }
      else
      {
        crc >>= 1; // 只右移一位
      }
    }
  }
  return crc; // 返回最终的 CRC 值
}

